home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library / Microsoft Programmer's Library (CD-ROM Database)(125-099-008)(Version 1.1a)(CDRM 162100)(1989).iso / SAMPCODE / OS2SDK11 / TK4 / OPENDLG / FILE.C < prev    next >
C/C++ Source or Header  |  1989-02-20  |  20KB  |  632 lines

  1. /*
  2.     FILE.C -- Open/Save As Dialog Box library routines
  3.     Created by Microsoft Corporation, 1989
  4. */
  5. #define  INCL_DOSQUEUES
  6. #include "tool.h"
  7.  
  8.  
  9. /****************************************************************************\
  10. * This function is the Open dialog box window procedure.  It handles input,
  11. * allows the user to change directories, checks for legal filenames, opens
  12. * specified files, appends default extensions and returns the file's name.
  13. *
  14. * The return values are
  15. *   TDF_INVALID - Library error (internal error),
  16. *   TDF_NOOPEN  - User hits cancel
  17. *   TDF_NEWOPEN - Created new file (file left open)
  18. *   TDF_OLDOPEN - Opened existing file (file left open)
  19. \****************************************************************************/
  20.  
  21. MRESULT CALLBACK DlgOpenWndProc(hwnd, msg, mp1, mp2)
  22. HWND hwnd;
  23. USHORT msg;
  24. MPARAM mp1;
  25. MPARAM mp2;
  26.     {
  27.     PDLF pdlf;
  28.     PSZ  lpchFile;
  29.     CHAR sz[MAX_FNAME_LEN];
  30.  
  31.     switch (msg)
  32.         {
  33.     case WM_INITDLG:
  34.         /* initialize dialog box */
  35.         DlgInitOpen(hwnd, LONGFROMMP(mp2));
  36.  
  37.         /* fill static field with path name and fill list box with
  38.            filenames that lMatch spec */
  39.         if (!DlgDirList(hwnd, ((PDLF)(mp2))->pszExt+1, ID_DIRLIST,
  40.                         ID_FILELIST, ID_PATH, ((PDLF)(mp2))->rgbFlags))
  41.             /* NOTE: shouldn't we post a message if something screws up? */
  42.             WinDismissDlg(hwnd, TDF_INVALID);
  43.         break;
  44.  
  45.     case WM_COMMAND:
  46.         pdlf = (PDLF) WinQueryWindowULong(hwnd, 0);
  47.         switch (SHORT1FROMMP(mp1))
  48.             {
  49.         case MBID_OK:
  50.             /* Open button pressed */
  51.             /* get name from edit box */
  52.             WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
  53.                 CBROOTNAMEMAX, (PSZ)pdlf->szFileName);
  54.         Upper((PSZ)pdlf->szFileName);
  55.             if (lstrlen((PSZ)pdlf->szFileName))
  56.                 DlgOpenName(hwnd, pdlf);
  57.             break;
  58.  
  59.         case MBID_CANCEL:
  60.             /* Cancel button pressed, dismiss dialog box */
  61.             WinDismissDlg(hwnd, TDF_NOOPEN);
  62.         break;
  63.  
  64.     case MBID_HELP:
  65.         /* Help button pressed */
  66.         WinMessageBox( HWND_DESKTOP
  67.              , hwnd
  68.              , pdlf->pszInstructions
  69.              , pdlf->pszTitle
  70.              , NULL
  71.              , MB_OK | MB_APPLMODAL );
  72.         break;
  73.             }
  74.         break;
  75.  
  76.     case WM_CONTROL:
  77.         pdlf = (PDLF) WinQueryWindowULong(hwnd, 0);
  78.         switch (SHORT1FROMMP(mp1))
  79.             {
  80.         case ID_DIRLIST:
  81.             /* user clicked in directory list box */
  82.             switch (SHORT2FROMMP(mp1))
  83.                 {
  84.             case LN_SELECT:
  85.                 /* single click case */
  86.                 /* get current edit string */
  87.                 WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
  88.                                    CBROOTNAMEMAX, (PSZ)sz);
  89.                 Upper((PSZ)sz);
  90.  
  91.                 /* get selected string */
  92.                 if (DlgDirSelect(hwnd, (PSZ)pdlf->szFileName, ID_DIRLIST))
  93.                     {
  94.                     /* if edit field contains wild card, then append file
  95.                part to selected directory, otherwise append
  96.                last wildcard search spec */
  97.                     lpchFile = FileInPath((PSZ)sz);
  98.             lstrcat( (PSZ)pdlf->szFileName
  99.                , DlgSearchSpec( lpchFile)
  100.                  ? lpchFile
  101.                  : (PSZ)pdlf->szLastWild );
  102.                     /* set edit box to resulting name */
  103.                     WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT),
  104.                                      (PSZ)pdlf->szFileName);
  105.                     }
  106.                 break;
  107.  
  108.             case LN_ENTER:
  109.         /* get text from edit box */
  110.         WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
  111.                    CBROOTNAMEMAX, (PSZ)pdlf->szFileName);
  112.         Upper((PSZ)pdlf->szFileName);
  113.         if( DlgSearchSpec( (PSZ)pdlf->szFileName))
  114.             {
  115.             DlgDirList( hwnd
  116.                   , (PSZ)pdlf->szFileName
  117.                   , ID_DIRLIST
  118.                   , ID_FILELIST
  119.                   , ID_PATH
  120.                   , pdlf->rgbFlags );
  121.             lstrcpy( (PSZ)pdlf->szLastWild
  122.                , FileInPath( (PSZ)pdlf->szFileName));
  123.             WinSetWindowText( WinWindowFromID( hwnd, ID_EDIT)
  124.                     , (PSZ)pdlf->szFileName );
  125.             }
  126.                 break;
  127.                 }
  128.             break;
  129.  
  130.         case ID_FILELIST:
  131.             /* user clicked in file list box */
  132.             switch (SHORT2FROMMP(mp1))
  133.                 {
  134.             case LN_SELECT:
  135.                 /* single click case */
  136.  
  137.         /* get current edit string */
  138.         /* if it contains a wildcard, save it before obliteration */
  139.                 WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
  140.                                    CBROOTNAMEMAX, (PSZ)sz);
  141.         Upper((PSZ)sz);
  142.         if( DlgSearchSpec( (PSZ)sz))
  143.             lstrcpy( (PSZ)pdlf->szLastWild, FileInPath( (PSZ)sz));
  144.  
  145.                 /* get selected file name */
  146.                 DlgDirSelect(hwnd, (PSZ)pdlf->szFileName, ID_FILELIST);
  147.                 /* set edit box to resulting name */
  148.                 WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT),
  149.                                  (PSZ)pdlf->szFileName);
  150.                 break;
  151.  
  152.             case LN_ENTER:
  153.                 /* double click case, single click already processed */
  154.                 DlgOpenName(hwnd, pdlf);
  155.                 break;
  156.                 }
  157.             break;
  158.             }
  159.         break;
  160.  
  161.     default:
  162.         return (WinDefDlgProc(hwnd, msg, mp1, mp2));
  163.         }
  164.  
  165.     return (MRFROMLONG(0L));  /* message processed */
  166.     }
  167.  
  168.  
  169.  
  170.  
  171. /****************************************************************************\
  172. * This function stores the pdlf in the dialog window structure, sets
  173. * the title and instruction texts and limits the text size.
  174. \****************************************************************************/
  175.  
  176. VOID PASCAL DlgInitOpen (hwnd, lpParm)
  177. HWND hwnd;
  178. ULONG lpParm;
  179.     {
  180.     PDLF pdlf;
  181.  
  182.     /* Set pdlf local to window */
  183.     pdlf = (PDLF) lpParm;
  184.     WinSetWindowULong(hwnd, 0, lpParm);
  185.  
  186.     /* set edit box text size limit */
  187.     WinSendDlgItemMsg(hwnd, ID_EDIT, EM_SETTEXTLIMIT, (MPARAM)CBROOTNAMEMAX, 0L);
  188.  
  189.     /* set edit window to search spec */
  190.     if (pdlf->pszExt != (PSZ)NULL)
  191.         WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT), pdlf->pszExt+1);
  192.  
  193.     /* set title window */
  194.     if (pdlf->pszTitle != (PSZ)NULL)
  195.     WinSetWindowText(WinWindowFromID(hwnd, FID_TITLEBAR), pdlf->pszTitle);
  196.     }
  197.  
  198.  
  199.  
  200.  
  201. /****************************************************************************\
  202. * This function processes the currently selected name in the open dialog
  203. * box.  If the name represents a directory, the current directory is
  204. * changed to that one and the corresponding files are displayed.  If the
  205. * name is a file, then it is opened.
  206. \****************************************************************************/
  207.  
  208. VOID PASCAL DlgOpenName(hwnd, pdlf)
  209. HWND hwnd;
  210. PDLF pdlf;
  211.     {
  212.     PSZ  lpch;
  213.     USHORT wVal;
  214.     CHAR sz[MAX_FNAME_LEN];
  215.  
  216.     /* try using current name as a directory */
  217.     lstrcpy((PSZ)sz, (PSZ)pdlf->szFileName);
  218.     if (!DlgSearchSpec((PSZ)sz))
  219.         DlgAddSearchExt(pdlf, (PSZ)sz);
  220.     if (DlgDirList(hwnd, (PSZ)sz, ID_DIRLIST, ID_FILELIST, ID_PATH,
  221.                    pdlf->rgbFlags))
  222.         {
  223.         /* name was a directory, extract and set file name */
  224.         lpch = FileInPath((PSZ)sz);
  225.         lstrcpy((PSZ)pdlf->szFileName, lpch);
  226.         WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT),
  227.                          (PSZ)pdlf->szFileName);
  228.         }
  229.     else
  230.         /* try to open name as a file */
  231.         if ((wVal = DlgOpenFile(pdlf, hwnd)) != TDF_NOOPEN)
  232.             WinDismissDlg(hwnd, wVal);
  233.     }
  234.  
  235.  
  236.  
  237.  
  238. /****************************************************************************\
  239. * This function is the SaveAs dialog box window procedure.  It handles input,
  240. * tests for legal filenames and uses message boxes to report any problems.
  241. *
  242. * Return values are:
  243. *     TDF_INVALID - Library error (internal error),
  244. *     TDF_NOOPEN  - User hits cancel
  245. *   Specific for DLG_NOOPEN
  246. *     TDF_NEWSAVE - user wants to save to a new file (file not created)
  247. *     TDF_OLDSAVE - user wants to save over existing file (file not opened)
  248. *   else
  249. *     TDF_NEWSAVE - user wants to save to a new file (file left open)
  250. *     TDF_OLDSAVE - user wants to save over existing file (file left open)
  251. \****************************************************************************/
  252.  
  253. MRESULT CALLBACK DlgSaveAsWndProc(hwnd, msg, mp1, mp2)
  254. HWND   hwnd;
  255. USHORT msg;
  256. MPARAM mp1;
  257. MPARAM mp2;
  258.     {
  259.     PDLF    pdlf;
  260.     PSZ     lpchFile;
  261.     CHAR    sz[MAX_FNAME_LEN];
  262.  
  263.     switch (msg)
  264.         {
  265.     case WM_INITDLG:
  266.         /* Store pdlf, set instructions, limit text size */
  267.         DlgInitSaveAs(hwnd, LONGFROMMP(mp2));
  268.  
  269.         /* fill static field with path name and fill list box with
  270.            filenames that lMatch spec */
  271.         if (!DlgDirList(hwnd, ((PDLF)(mp2))->pszExt+1, ID_DIRLIST,
  272.                         ID_FILELIST, ID_PATH, ((PDLF)(mp2))->rgbFlags))
  273.             /* NOTE: shouldn't we post a message if something screws up? */
  274.             WinDismissDlg(hwnd, TDF_INVALID);
  275.         break;
  276.  
  277.     case WM_COMMAND:
  278.         pdlf = (PDLF) WinQueryWindowULong(hwnd, 0);
  279.         switch (SHORT1FROMMP(mp1))
  280.            {
  281.         case MBID_OK:
  282.             /* get text from edit box */
  283.             WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
  284.                                CBROOTNAMEMAX, (PSZ)pdlf->szFileName);
  285.         Upper((PSZ)pdlf->szFileName);
  286.         if( DlgSearchSpec( (PSZ)pdlf->szFileName))
  287.         {
  288.         DlgDirList( hwnd
  289.               , (PSZ)pdlf->szFileName
  290.               , ID_DIRLIST
  291.               , ID_FILELIST
  292.               , ID_PATH
  293.               , pdlf->rgbFlags );
  294.         lstrcpy( (PSZ)pdlf->szLastWild
  295.                , FileInPath( (PSZ)pdlf->szFileName));
  296.         lstrcpy( (PSZ)pdlf->szFileName, (PSZ)pdlf->szLastFile);
  297.         WinSetWindowText( WinWindowFromID( hwnd, ID_EDIT)
  298.                 , (PSZ)pdlf->szFileName );
  299.         }
  300.         else if( lstrlen( (PSZ)pdlf->szFileName))
  301.         DlgSaveAsName( hwnd, pdlf);
  302.             break;
  303.  
  304.         case MBID_CANCEL:
  305.             WinDismissDlg(hwnd, TDF_NOSAVE);
  306.             break;
  307.  
  308.     case MBID_HELP:
  309.         /* Help button pressed */
  310.         WinMessageBox( HWND_DESKTOP
  311.              , hwnd
  312.              , pdlf->pszInstructions
  313.              , pdlf->pszTitle
  314.              , NULL
  315.              , MB_OK | MB_APPLMODAL );
  316.         break;
  317.             }
  318.         break;
  319.  
  320.     case WM_CONTROL:
  321.         pdlf = (PDLF) WinQueryWindowULong(hwnd, 0);
  322.         switch (SHORT1FROMMP(mp1))
  323.             {
  324.         case ID_DIRLIST:
  325.             /* user clicked in directory list box */
  326.             switch (SHORT2FROMMP(mp1))
  327.                 {
  328.             case LN_SELECT:
  329.                 /* single click case */
  330.                 /* get current edit string */
  331.                 WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
  332.                                    CBROOTNAMEMAX, (PSZ)sz);
  333.                 Upper((PSZ)sz);
  334.  
  335.                 /* get selected string */
  336.                 if (DlgDirSelect(hwnd, (PSZ)pdlf->szFileName, ID_DIRLIST))
  337.                     {
  338.                     /* if edit field contains wild card, then append file
  339.                part to selected directory, otherwise append
  340.                last wildcard search spec */
  341.                     lpchFile = FileInPath((PSZ)sz);
  342.             if( DlgSearchSpec( lpchFile))
  343.             {
  344.             lstrcat( (PSZ)pdlf->szFileName, lpchFile );
  345.             lstrcpy( (PSZ)pdlf->szLastWild, lpchFile);
  346.             }
  347.             else
  348.             {
  349.             lstrcat( (PSZ)pdlf->szFileName, (PSZ)pdlf->szLastWild );
  350.             lstrcpy( (PSZ)pdlf->szLastFile, lpchFile);
  351.             }
  352.                     /* set edit box to resulting name */
  353.                     WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT),
  354.                                      (PSZ)pdlf->szFileName);
  355.                     }
  356.                 break;
  357.  
  358.             case LN_ENTER:
  359.         /* get text from edit box */
  360.         WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
  361.                    CBROOTNAMEMAX, (PSZ)pdlf->szFileName);
  362.         Upper((PSZ)pdlf->szFileName);
  363.         if( DlgSearchSpec( (PSZ)pdlf->szFileName))
  364.             {
  365.             DlgDirList( hwnd
  366.                   , (PSZ)pdlf->szFileName
  367.                   , ID_DIRLIST
  368.                   , ID_FILELIST
  369.                   , ID_PATH
  370.                   , pdlf->rgbFlags );
  371.             lstrcpy( (PSZ)pdlf->szLastWild
  372.                , FileInPath( (PSZ)pdlf->szFileName));
  373.             lstrcpy( (PSZ)pdlf->szFileName, (PSZ)pdlf->szLastFile);
  374.             WinSetWindowText( WinWindowFromID( hwnd, ID_EDIT)
  375.                     , (PSZ)pdlf->szFileName );
  376.             }
  377.         break;
  378.         }
  379.             break;
  380.  
  381.         case ID_FILELIST:
  382.             /* user clicked in file list box */
  383.             switch (SHORT2FROMMP(mp1))
  384.                 {
  385.             case LN_SELECT:
  386.                 /* single click case */
  387.  
  388.         /* get current edit string */
  389.         /* if it contains a wildcard, save it before obliteration */
  390.                 WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
  391.                                    CBROOTNAMEMAX, (PSZ)sz);
  392.         Upper((PSZ)sz);
  393.         if( DlgSearchSpec( (PSZ)sz))
  394.             lstrcpy( (PSZ)pdlf->szLastWild, FileInPath( (PSZ)sz));
  395.  
  396.                 /* get selected file name */
  397.                 DlgDirSelect(hwnd, (PSZ)pdlf->szFileName, ID_FILELIST);
  398.                 /* set edit box to resulting name */
  399.                 WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT),
  400.                                  (PSZ)pdlf->szFileName);
  401.                 break;
  402.  
  403.             case LN_ENTER:
  404.                 /* double click case, single click already processed */
  405.         DlgSaveAsName(hwnd, pdlf);
  406.                 break;
  407.                 }
  408.             break;
  409.             }
  410.         break;
  411.  
  412.     default:
  413.         return (WinDefDlgProc(hwnd, msg, mp1, mp2));
  414.         }
  415.  
  416.     return (MRFROMLONG(0L));    /* message processed */
  417.     }
  418.  
  419.  
  420.  
  421. /******************************************************************************/
  422. /*                                          */
  423. /* This function attempts to open a file for writing.  It queries if over-    */
  424. /* write is OK if the file already exists.                      */
  425. /*                                          */
  426. /******************************************************************************/
  427. VOID PASCAL DlgSaveAsName( hwnd, pdlf)
  428. HWND  hwnd;
  429. PDLF  pdlf;
  430.     {
  431.     USHORT  usTdf;
  432.  
  433.     /* add extension if there is not one already */
  434.     AddExt((PSZ)pdlf->szFileName, pdlf->pszExt);
  435.     /* test file name legality */
  436.     if (!DlgParseFile((PSZ)pdlf->szFileName,
  437.               (PSZ)pdlf->szOpenFile, FALSE, FALSE))
  438.     {
  439.     /* illegal filename */
  440.     DlgAlertBox(hwnd, IDS_IFN, pdlf,
  441.             MB_OK | MB_ICONEXCLAMATION);
  442.     return;
  443.     }
  444.     usTdf = TDF_NEWSAVE;
  445.     /* test if file already exists */
  446.     if (DlgParseFile((PSZ)pdlf->szFileName,
  447.              (PSZ)pdlf->szOpenFile, TRUE, FALSE))
  448.     {
  449.     /* overwrite? */
  450.     if (DlgAlertBox(hwnd, IDS_REF, pdlf,
  451.             MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION)
  452.         == MBID_NO)
  453.         return;
  454.     usTdf = TDF_OLDSAVE;
  455.     }
  456.     if (!(pdlf->rgbAction & DLG_NOOPEN) &&
  457.     !(OpenFile( (PSZ)pdlf->szFileName
  458.           , pdlf->phFile
  459.           , (PSZ)pdlf->szOpenFile
  460.           , OF_WRITE)))
  461.     {
  462.     DlgAlertBox(hwnd, IDS_EOF, pdlf,
  463.             MB_OK | MB_ICONEXCLAMATION);
  464.     return;
  465.     }
  466.     WinDismissDlg(hwnd, usTdf);
  467.     }
  468.  
  469.  
  470.  
  471. /****************************************************************************\
  472. * This function initializes the SaveAs dialog box.  It puts the current
  473. * directory string in the ID_PATH field and initializes the edit box
  474. * with the proposed filename.  It is the simple relative file name if current
  475. * dir == pdlf->szOpenFile.  Otherwise, it is the fully qualified name.
  476. \****************************************************************************/
  477.  
  478. VOID PASCAL DlgInitSaveAs (hwnd, lpParm)
  479. HWND hwnd;
  480. ULONG lpParm;
  481.     {
  482.     PDLF pdlf;
  483.     CHAR sz[MAX_FNAME_LEN];
  484.     PSZ  lpszFile, lpszFN, lpszCD;
  485.  
  486.     /* set pdlf local to window */
  487.     pdlf = (PDLF) lpParm;
  488.     WinSetWindowULong(hwnd, 0, lpParm);
  489.  
  490.     /* set edit box text size limit */
  491.     WinSendDlgItemMsg(hwnd, ID_EDIT, EM_SETTEXTLIMIT, (MPARAM)CBROOTNAMEMAX, 0L);
  492.  
  493.     /* set title window */
  494.     if (pdlf->pszTitle != (PSZ)NULL)
  495.     WinSetWindowText(WinWindowFromID(hwnd, FID_TITLEBAR), pdlf->pszTitle);
  496.  
  497.     /* set szLastWild to search spec */
  498.     if (pdlf->pszExt != (PSZ)NULL)
  499.     lstrcpy( (PSZ)pdlf->szLastWild, (PSZ)pdlf->pszExt+1 );
  500.  
  501.     /* get current directory */
  502.     DosSearchPath(0, (PSZ)szDot, (PSZ)szStarStar, (PSZ)sz, MAX_FNAME_LEN);
  503.     lpszFile = FileInPath((PSZ)sz);
  504.     if (lpszFile > (PSZ)sz + 3)
  505.         lpszFile--;
  506.     *lpszFile = '\0';
  507.  
  508.     /* compare path part name to previously opened file name and
  509.        make the file name relative if they are the same */
  510.     lpszFN = (PSZ)pdlf->szOpenFile;
  511.     lpszCD = (PSZ)sz;
  512.     lpszFile = FileInPath((PSZ)pdlf->szOpenFile);
  513.     while (lpszFN < lpszFile && *lpszFN == *lpszCD)
  514.         {
  515.         lpszFN = NextChar(lpszFN);
  516.         lpszCD = NextChar(lpszCD);
  517.         }
  518.     if (*lpszCD)
  519.         lpszFN = (PSZ)pdlf->szOpenFile;
  520.     else if (*lpszFN == '\\')
  521.     lpszFN = NextChar(lpszFN);
  522.     Upper( lpszFN);
  523.     WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT), lpszFN);
  524.     lstrcpy( (PSZ)pdlf->szLastFile, lpszFN);
  525.  
  526.     /* set current path field */
  527.     WinSetWindowText(WinWindowFromID(hwnd, ID_PATH),
  528.                      DlgFitPathToBox(hwnd, ID_PATH, (PSZ)sz));
  529.     }
  530.  
  531.  
  532.  
  533.  
  534. /****************************************************************************\
  535. * This function returns the filename part of the given path string.
  536. \****************************************************************************/
  537.  
  538. PSZ  CALLBACK FileInPath(lpsz)
  539. PSZ  lpsz;
  540.     {
  541.     PSZ  lpch;
  542.  
  543.     /* strip path/drive specification from name if there is one */
  544.     lpch = lpsz + lstrlen(lpsz);
  545.     while (lpch > lpsz)
  546.         {
  547.         lpch = PrevChar(lpsz, lpch);
  548.         if (*lpch == '\\' || *lpch == ':')
  549.             {
  550.             lpch = NextChar(lpch);
  551.             break;
  552.             }
  553.         }
  554.     return(lpch);
  555.     }
  556.  
  557.  
  558.  
  559.  
  560. /****************************************************************************\
  561. * This function adds the extension to a file name if it is missing.
  562. \****************************************************************************/
  563.  
  564. VOID CALLBACK AddExt(lpsz, lpszExt)
  565. PSZ  lpsz;
  566. PSZ  lpszExt;
  567.     {
  568.     PSZ  lpch;
  569.  
  570.     lpch = lpsz + lstrlen(lpsz);
  571.     while (*lpch != '.' && *lpch != '\\' && *lpch != ':' && lpch > lpsz)
  572.         lpch = PrevChar(lpsz, lpch);
  573.  
  574.     if (*lpch != '.')
  575.         lstrcat(lpsz, (PSZ)(lpszExt+2));
  576.     }
  577.  
  578.  
  579.  
  580.  
  581. /****************************************************************************\
  582. * This function adds the "appropriate" extension to a filename, partial
  583. * filename, search spec or partial search spec.
  584. \****************************************************************************/
  585.  
  586. VOID PASCAL DlgAddSearchExt(pdlf, lpszEdit)
  587. PDLF pdlf;
  588. PSZ  lpszEdit;
  589.     {
  590.     PSZ  lpchLast;
  591.  
  592.     lpchLast = PrevChar(lpszEdit, lpszEdit + lstrlen(lpszEdit));
  593.     if (*lpchLast == '\\' || *lpchLast == ':')
  594.         lstrcat(lpszEdit, pdlf->pszExt + 1);
  595.     else
  596.         lstrcat(lpszEdit, pdlf->pszExt);
  597.     }
  598.  
  599.  
  600.  
  601.  
  602. /****************************************************************************\
  603. * This function returns TRUE if lpsz contains a wildcard character '*' or '?';
  604. \****************************************************************************/
  605.  
  606. BOOL PASCAL DlgSearchSpec(lpsz)
  607. PSZ  lpsz;
  608.    {
  609.     for (; *lpsz; lpsz = NextChar(lpsz))
  610.         if (*lpsz == '*' || *lpsz == '?')
  611.             return TRUE;
  612.     return FALSE;
  613.    }
  614.  
  615.  
  616.  
  617.  
  618. /****************************************************************************\
  619. * This function displays an error or warning msg.
  620. \****************************************************************************/
  621.  
  622. int PASCAL DlgAlertBox(hwnd, ids, pdlf, wStyle)
  623. HWND hwnd;
  624. int ids;
  625. PDLF pdlf;
  626. USHORT wStyle;
  627.     {
  628.     /* note:  5th param is idHelp */
  629.     return (AlertBox(hwnd, ids, (PSZ)pdlf->szFileName, pdlf->pszAppName,
  630.                          NULL, wStyle | MB_APPLMODAL));
  631.     }
  632.